再來要聊聊很基本的東西 - errors。
這個東西呢,只要在你的 model validation 沒有通過的話,就一定會產生錯誤訊息。
這是普遍對他的認知。然而事實上是相反的,應該是:
只要在 validation 階段往 errors 裡面塞訊息,就會導致 model validation 不通過。
因為 valid?
內部實作,結尾回傳值是
errors.blank?
所以不管你在 validation 階段往裡面塞什麼訊息,valid?
都會回傳 false。
如果想要往 errors 裡面加訊息,大多數人都會使用
errors.add(:name, :blank)
但其實,他背後會去檢查你的物件是否有 name
這個 method。
那這其實也代表,validation 的對象其實不僅只於欄位,也可以是某個 method 的回傳值,像是:
class User < ApplicationRecord
# 要有下單才建立顧客資料
validates_presence_of :orders
def orders
# 撈取顧客訂單資料
end
end
這樣就可以讓 orders
這個 method 不僅只是用來撈訂單,更可以用在 validation 上。
好,回到 errors。
如果我很想要往我的 errors 塞入自訂訊息,並且不檢查是否有 method,我該怎麼做?
很簡單,Rails 在 errors 提供了一個 :base
的 key,只要你的 key 指定為 :base
,那 errors 就不會去做 method 的檢查。
errors.add(:base, "My custom message")
下一篇再介紹 errors 的 I18n 翻譯規則~。